#include <stdio.h>
#include <stdlib.h>
#include <time.h>

// 函数声明
void generateRandomNumbers(int numbers[], int count, int max, int exclude[], int excludeCount);

int main() {
    int numTickets, i, j;
    int frontNumbers[5], backNumbers[2]; // 机选结果
    int danmaFront[5] = {0}, danmaBack[2] = {0}; // 用户指定的胆码
    int danmaCountFront = 0, danmaCountBack = 0; // 前区、后区胆码个数
    int isDanTuo; // 是否启用胆拖

    // 初始化随机数种子
    srand(time(NULL));

    // 用户输入是否使用胆拖玩法
    printf("是否使用胆拖玩法？(1: 是, 0: 否): ");
    scanf("%d", &isDanTuo);

    if (isDanTuo) {
        printf("请输入前区胆码数量(1-4): ");
        scanf("%d", &danmaCountFront);
        printf("请输入前区胆码(用空格分隔): ");
        for (i = 0; i < danmaCountFront; i++) {
            scanf("%d", &danmaFront[i]);
        }

        printf("请输入后区胆码数量(1-1): ");
        scanf("%d", &danmaCountBack);
        printf("请输入后区胆码: ");
        for (i = 0; i < danmaCountBack; i++) {
            scanf("%d", &danmaBack[i]);
        }
    }

    // 输入注数
    printf("请输入您想生成的注数: ");
    scanf("%d", &numTickets);

    printf("\n超级大乐透机选号码如下:\n");

    for (i = 0; i < numTickets; i++) {
        // 生成前区号码
        if (isDanTuo) {
            // 胆码+拖码
            for (j = 0; j < danmaCountFront; j++) {
                frontNumbers[j] = danmaFront[j];
            }
            generateRandomNumbers(&frontNumbers[danmaCountFront], 5 - danmaCountFront, 35, danmaFront, danmaCountFront);
        } else {
            // 普通模式
            generateRandomNumbers(frontNumbers, 5, 35, NULL, 0);
        }

        // 生成后区号码
        if (isDanTuo) {
            // 胆码+拖码
            for (j = 0; j < danmaCountBack; j++) {
                backNumbers[j] = danmaBack[j];
            }
            generateRandomNumbers(&backNumbers[danmaCountBack], 2 - danmaCountBack, 12, danmaBack, danmaCountBack);
        } else {
            // 普通模式
            generateRandomNumbers(backNumbers, 2, 12, NULL, 0);
        }

        // 输出结果
        printf("第%d注: 前区[", i + 1);
        for (j = 0; j < 5; j++) {
            printf("%02d ", frontNumbers[j]);
        }
        printf("] 后区[");
        for (j = 0; j < 2; j++) {
            printf("%02d ", backNumbers[j]);
        }
        printf("]\n");
    }

    return 0;
}

// 生成不重复的随机号码（支持排除指定号码）
void generateRandomNumbers(int numbers[], int count, int max, int exclude[], int excludeCount) {
    int temp, i, j;
    int isExcluded;

    for (i = 0; i < count; i++) {
        do {
            temp = rand() % max + 1; // 生成范围为1到max的随机数
            // 检查是否重复或在排除列表中
            isExcluded = 0;
            for (j = 0; j < i; j++) {
                if (numbers[j] == temp) {
                    isExcluded = 1;
                    break;
                }
            }
            for (j = 0; j < excludeCount && !isExcluded; j++) {
                if (exclude[j] == temp) {
                    isExcluded = 1;
                }
            }
        } while (isExcluded);
        numbers[i] = temp;
    }

    // 对生成的号码排序（可选）
    for (i = 0; i < count - 1; i++) {
        for (j = 0; j < count - i - 1; j++) {
            if (numbers[j] > numbers[j + 1]) {
                temp = numbers[j];
                numbers[j] = numbers[j + 1];
                numbers[j + 1] = temp;
            }
        }
    }
}
